package com.sybil.spa.dominio;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinColumns;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;

@Entity
@Table(name = "SPA_REEMBOLSOS")
@NamedQueries({
   @NamedQuery(
           name = "Reembolso.maxReembolso",
           query = "SELECT MAX(numero) FROM Reembolso r"
   )
})
public class Reembolso implements Serializable {

   private static final long serialVersionUID = 1L;
   private Integer numero;
   private String descripcion;
   private String claveUsuario;
   private String numeroProveedorUsuario;
   private String clavePlanta;
   private String centroCosto;
   private Date fecha;
   private String estatus;
   private double montoFavorUsuario;
   private double montoFavorCia;
   private String usuarioCreo;
   private String usuarioModif;
   private TipoSolicitud tipoSolicitud;
   private List<DetalleReembolso> detalles;
   private List<AnticipoReembolso> anticipos;
   private Solicitud solicitud;
   private Usuario usuario;

   public Reembolso() {
   }

   public Reembolso(Integer numero) {
      this.numero = numero;
   }

   public Reembolso(Integer numero, String descripcion, String claveUsuario,
           String estatus, double montoFavorUsuario, double montoFavorCia,
           String usuarioCreo) {
      this.numero = numero;
      this.descripcion = descripcion;
      this.claveUsuario = claveUsuario;
      this.estatus = estatus;
      this.montoFavorUsuario = montoFavorUsuario;
      this.montoFavorCia = montoFavorCia;
      this.usuarioCreo = usuarioCreo;
   }

   @Id
   @Basic(optional = false)
   @Column(name = "REEM_NUMERO")
   public Integer getNumero() {
      return numero;
   }

   @Basic(optional = false)
   @NotNull
   @Size(min = 1, max = 250)
   @Column(name = "REEM_DESCRIPCION")
   public String getDescripcion() {
      return descripcion;
   }

   @Basic(optional = false)
   @Column(name = "REEM_USUARIO_AD")
   public String getClaveUsuario() {
      return claveUsuario;
   }

   @Size(max = 10)
   @Column(name = "REEM_PROV_USUARIO")
   public String getNumeroProveedorUsuario() {
      return numeroProveedorUsuario;
   }

   @Size(max = 50)
   @Column(name = "REEM_PLANTA")
   public String getClavePlanta() {
      return clavePlanta;
   }

   @Size(max = 20)
   @Column(name = "REEM_CENTRO_COSTO")
   public String getCentroCosto() {
      return centroCosto;
   }

   @Basic(optional = false)
   @Column(name = "REEM_FECHA")
   @Temporal(TemporalType.TIMESTAMP)
   public Date getFecha() {
      return fecha;
   }

   @Basic(optional = false)
   @Column(name = "REEM_ESTATUS")
   public String getEstatus() {
      return estatus;
   }

   @Basic(optional = false)
   @Column(name = "REEM_MONTO_FAVOR_USUARIO")
   public double getMontoFavorUsuario() {
      return montoFavorUsuario;
   }

   @Basic(optional = false)
   @Column(name = "REEM_MONTO_FAVOR_CIA")
   public double getMontoFavorCia() {
      return montoFavorCia;
   }

   @Basic(optional = false)
   @Column(name = "REEM_USUARIO_CREO")
   public String getUsuarioCreo() {
      return usuarioCreo;
   }

   @Column(name = "REEM_USUARIO_MODIF")
   public String getUsuarioModif() {
      return usuarioModif;
   }

   @JoinColumn(name = "REEM_TISO_CLAVE", referencedColumnName = "TISO_CLAVE")
   @ManyToOne(optional = false)
   public TipoSolicitud getTipoSolicitud() {
      return tipoSolicitud;
   }

   @JoinColumns({
      @JoinColumn(name = "REEM_FLUJ_CLAVE", referencedColumnName = "HIFL_FLUJ_CLAVE"),
      @JoinColumn(name = "REEM_HIFL_NUMERO", referencedColumnName = "HIFL_NUMERO")})
   @OneToOne
   public Solicitud getSolicitud() {
      return solicitud;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "reembolso")
   public List<DetalleReembolso> getDetalles() {
      return detalles;
   }

   @OneToMany(cascade = CascadeType.ALL, mappedBy = "reembolso")
   public List<AnticipoReembolso> getAnticipos() {
      return anticipos;
   }

   @Transient
   public Usuario getUsuario() {
      return usuario;
   }

   public void setUsuario(Usuario usuario) {
      this.usuario = usuario;
   }

   public void setNumero(Integer numero) {
      this.numero = numero;
   }

   public void setDescripcion(String descripcion) {
      this.descripcion = descripcion;
   }

   public void setClaveUsuario(String claveUsuario) {
      this.claveUsuario = claveUsuario;
   }

   public void setNumeroProveedorUsuario(String numeroProveedorUsuario) {
      this.numeroProveedorUsuario = numeroProveedorUsuario;
   }

   public void setClavePlanta(String clavePlanta) {
      this.clavePlanta = clavePlanta;
   }

   public void setCentroCosto(String centroCosto) {
      this.centroCosto = centroCosto;
   }

   public void setFecha(Date fecha) {
      this.fecha = fecha;
   }

   public void setEstatus(String estatus) {
      this.estatus = estatus;
   }

   public void setMontoFavorUsuario(double montoFavorUsuario) {
      this.montoFavorUsuario = montoFavorUsuario;
   }

   public void setMontoFavorCia(double montoFavorCia) {
      this.montoFavorCia = montoFavorCia;
   }

   public void setUsuarioCreo(String usuarioCreo) {
      this.usuarioCreo = usuarioCreo;
   }

   public void setUsuarioModif(String usuarioModif) {
      this.usuarioModif = usuarioModif;
   }

   public void setDetalles(List<DetalleReembolso> detalles) {
      this.detalles = detalles;
   }

   public void setTipoSolicitud(TipoSolicitud tipoSolicitud) {
      this.tipoSolicitud = tipoSolicitud;
   }

   public void setSolicitud(Solicitud solicitud) {
      this.solicitud = solicitud;
   }

   public void setAnticipos(List<AnticipoReembolso> anticipos) {
      this.anticipos = anticipos;
   }

   @Override
   public int hashCode() {
      int hash = 0;
      hash += (numero != null ? numero.hashCode() : 0);
      return hash;
   }

   @Override
   public boolean equals(Object object) {
      if (!(object instanceof Reembolso)) {
         return false;
      }
      Reembolso other = (Reembolso) object;
      if ((this.numero == null && other.numero != null) || (this.numero != null && !this.numero.equals(other.numero))) {
         return false;
      }
      return true;
   }

   @Override
   public String toString() {
      return "Reembolso[ numero=" + numero + " ]";
   }
}
